home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 2000
/
MacHack 2000.toast
/
pc
/
The Hacks
/
Softshoe
/
Lisa's Mac Parts
/
Views
/
Canvas
/
Canvas.cp
next >
Wrap
Text File
|
2000-06-23
|
6KB
|
323 lines
// Canvas.cp
#ifndef Canvas_h
#include "Canvas.h"
#endif
#ifndef GrafPortObject_h
#include "GrafPortObject.h"
#endif
#ifndef WindowObject_h
#include "WindowObject.h"
#endif
#ifndef CanvasMaintainer_h
#include "CanvasMaintainer.h"
#endif
Canvas::Canvas()
: PortMap( Rectangle32::zero, Rectangle::zero ),
port( 0 ),
window( 0 )
{
}
Canvas::Canvas( GrafPortObject& thePort )
: PortMap( PortMap::Identity( thePort.LocalBounds() ) ),
port( &thePort ),
window( 0 ),
clip( thePort.VisibleRegion() )
{
PortMap::RestrictOnScreen( clip.Bounds() );
}
Canvas::Canvas( WindowObject& window )
: PortMap( PortMap::Identity( window.Port().LocalBounds() ) ),
port( &window.Port() ),
window( &window ),
clip( window.Port().VisibleRegion() )
{
PortMap::RestrictOnScreen( clip.Bounds() );
}
Canvas::Canvas( const Canvas& source )
: PortMap( source ),
port( source.port ),
window( source.window ),
clip( source.clip )
{
}
void Canvas::operator=( GrafPortObject& thePort )
{
Map() = PortMap::Identity( thePort.LocalBounds() );
port = &thePort;
window = 0;
clip = thePort.VisibleRegion();
PortMap::RestrictOnScreen( clip.Bounds() );
}
void Canvas::operator=( WindowObject& theWindow )
{
operator=( theWindow.Port() );
window = &theWindow;
}
bool Canvas::operator==( const Canvas& right ) const
{
return port == right.port && clip == right.clip;
}
void Canvas::RestrictOnScreen( Rectangle r )
{
PortMap::RestrictOnScreen( r );
clip &= OnScreen();
}
void Canvas::RestrictOnScreen( const RegionObject& r )
{
clip &= r;
PortMap::RestrictOnScreen( clip.Bounds() );
}
void Canvas::RestrictOffScreen( Rectangle32 r )
{
PortMap::RestrictOffScreen( r );
clip &= OnScreen();
}
void Canvas::RestrictToValid()
{
Assert( HasPort() );
if ( HasWindow() )
{
PointObject globalToLocal( window->Port().GlobalToLocal() );
clip -= globalToLocal;
clip -= window->InvalidRegion();
clip += globalToLocal;
PortMap::RestrictOnScreen( clip.Bounds() );
}
}
void Canvas::RestrictToInvalid()
{
Assert( HasPort() );
if ( HasWindow() )
{
PointObject globalToLocal( window->Port().GlobalToLocal() );
clip -= globalToLocal;
clip &= window->InvalidRegion();
clip += globalToLocal;
PortMap::RestrictOnScreen( clip.Bounds() );
}
else
{
PortMap::RestrictOnScreen( Rectangle::zero );
clip.BeEmpty();
}
}
void Canvas::Submap( Rectangle32 r )
{
PortMap::Submap( r );
clip &= OnScreen();
}
void Canvas::SliceHorizontally( Range32 verticalRange )
{
PortMap::SliceHorizontally( verticalRange );
clip &= OnScreen();
}
void Canvas::SliceVertically( Range32 horizontalRange )
{
PortMap::SliceVertically( horizontalRange );
clip &= OnScreen();
}
void Canvas::ObstructOnScreen( Rectangle r )
{
clip -= r;
PortMap::RestrictOnScreen( clip.Bounds() );
}
void Canvas::ObstructOnScreen( const RegionObject& r )
{
clip -= r;
PortMap::RestrictOnScreen( clip.Bounds() );
}
void Canvas::ObstructOffScreen( Rectangle32 r )
{
clip -= ToScreen( r );
PortMap::RestrictOnScreen( clip.Bounds() );
}
void Canvas::GetValidRegion( RegionObject& result ) const
{
result = clip;
if ( HasWindow() )
{
PointObject globalToLocal( window->Port().GlobalToLocal() );
result -= globalToLocal;
result -= window->InvalidRegion();
result += globalToLocal;
}
}
void Canvas::GetInvalidRegion( RegionObject& result ) const
{
if ( HasWindow() )
{
PointObject globalToLocal( window->Port().GlobalToLocal() );
result = clip;
result -= globalToLocal;
result &= window->InvalidRegion();
result += globalToLocal;
}
else
result.BeEmpty();
}
RegionObject& Canvas::TemporaryRegion()
{
static RegionObject region;
return region;
}
RegionObject& Canvas::ClippedRegion( Rectangle r ) const
{
RegionObject& temporary( TemporaryRegion() );
temporary = r;
temporary &= clip;
return temporary;
}
RegionObject& Canvas::ClippedRegion( const RegionObject& r ) const
{
RegionObject& temporary( TemporaryRegion() );
temporary = r;
temporary &= clip;
return temporary;
}
void Canvas::Validate() const
{
Assert( HasPort() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
ValidRgn( clip );
}
}
void Canvas::ValidateOnScreen( const RegionObject& r ) const
{
Assert( HasPort() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
ValidRgn( ClippedRegion( r ) );
}
}
void Canvas::ValidateOnScreen( Rectangle r ) const
{
Assert( HasPort() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
ValidRgn( ClippedRegion( r ) );
}
}
void Canvas::ValidateOffScreen( Rectangle32 r ) const
{
Assert( HasPort() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
ValidRgn( ClippedRegion( ToScreen( r ) ) );
}
}
void Canvas::Invalidate() const
{
Assert( HasPort() );
Assert( HasWindow() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
InvalRgn( clip );
}
}
void Canvas::InvalidateOnScreen( const RegionObject& r ) const
{
Assert( HasPort() );
Assert( HasWindow() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
InvalRgn( ClippedRegion( r ) );
}
}
void Canvas::InvalidateOnScreen( Rectangle r ) const
{
Assert( HasPort() );
Assert( HasWindow() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
InvalRgn( ClippedRegion( r ) );
}
}
void Canvas::InvalidateOffScreen( Rectangle32 r ) const
{
Assert( HasPort() );
Assert( HasWindow() );
if ( HasWindow() )
{
Assert( port->IsCurrent() );
InvalRgn( ClippedRegion( ToScreen( r ) ) );
}
}
void Copy( const Canvas& source, const Canvas& destination )
{
CanvasMaintainer cm( destination );
Rectangle32 sharedArea = source.OffScreen() & destination.OffScreen();
Rectangle sourceArea = source.ToScreen( sharedArea );
Rectangle destinationArea = destination.ToScreen( sharedArea );
PointObject distance = destinationArea.TopLeft() - sourceArea.TopLeft();
RegionObject valid;
source.GetValidRegion( valid );
valid += distance;
if ( distance != PointObject::zero )
CopyBits( &source.Port().portBits, &destination.Port().portBits,
&sourceArea, &destinationArea,
srcCopy,
valid );
if ( destination.HasWindow() )
{
ValidRgn( valid );
valid.Complement( destination.Clip() );
InvalRgn( valid );
}
}